#include <iostream>
#include <fstream>
#include "Resolver.h"

//agregados para casos de test
#include <ctime>
#include <sstream>

using namespace std;

void tests(string &filename);
void prueba_multiple(string &filename, ofstream &salida);

int main(int argc, char **argv)
{
    string filename;
    // Nota: siempre se pasa 1 parametro al menos que es el nombre del ejecutable.
    if(argc < 2)
    {
        cout << "Por favor, ingrese el nombre del archivo a testear" << endl;
	cin >> filename;
    }
    else
        filename = argv[1];

/*    ifstream entrada(filename.c_str());

    Resolver resultante(entrada);
    
    resultante.imprimirEntrada();

  
    // Aca ya estoy calculando _A;
    Matriz A = resultante.convertirEntrada();
    int n = A.cantFilas();
    Matriz Q(n, n);
    Matriz R(n, n);
    
/*	double** original = new double*[3];
	original[0] = new double[3];
	original[1] = new double[3];
	original[2] = new double[3];
	original[0][0] = 1.0;
	original[0][1] = 2.0;
	original[0][2] = 0.0;
	original[1][0] = 4.0;
	original[1][1] = 5.0;
	original[1][2] = 6.0;
	original[2][0] = 0.0;
	original[2][1] = 2.0;
	original[2][2] = 5.0;
	
	Matriz A(original, 3, 3);
	Matriz Q = Matriz::IDENTIDAD(3);
	Matriz R = Matriz::IDENTIDAD(3);
	
    resultante.factorizacion_QR(A, Q, R);
*/
    //cerr << "A: " <<  endl << A << endl << endl << "Q: " << endl << Q << endl << endl << "R: " << endl << R << endl;
    
/*	resultante.evitar_catastrofe();
	
	cout << resultante;
*/
	tests(filename);
	return 0;
}

void tests(string &filename)
{
	time_t raw_time;
	struct tm *timeinfo;
	time(&raw_time);
	timeinfo = localtime(&raw_time);
	stringstream nombre_archivo;
	nombre_archivo << "test_" << filename << "_" << (timeinfo->tm_year + 1900);
	if(timeinfo->tm_mon < 9)
		nombre_archivo << "0";
	nombre_archivo << (timeinfo->tm_mon + 1);
	if(timeinfo->tm_mday < 10)
		nombre_archivo << "0";
	nombre_archivo << timeinfo->tm_mday;
	nombre_archivo << "_";
	if(timeinfo->tm_hour < 10)
		nombre_archivo << "0";
	nombre_archivo << timeinfo->tm_hour;
	if(timeinfo->tm_min < 10)
		nombre_archivo << "0";
	nombre_archivo << timeinfo->tm_min;
	if(timeinfo->tm_sec < 10)
		nombre_archivo << "0";
	nombre_archivo << timeinfo->tm_sec;
	nombre_archivo << ".txt";
	ofstream salida(nombre_archivo.str().c_str());

	ifstream prueba3(filename.c_str());
/*
	ifstream prueba5("prueba5.txt");
	ifstream prueba5a("prueba5a.txt");
	ifstream prueba5b("prueba5b.txt");
	ifstream prueba5c("prueba5v.txt");
	ifstream prueba10("prueba10.txt");
	ifstream prueba10a("prueba10a.txt");
	ifstream prueba20("prueba20.txt");
*/
	salida << filename << endl;
	prueba_multiple(filename, salida);
/*	salida << endl << "prueba5.txt" << endl;
	prueba_multiple(prueba5, salida);
	salida << endl << "prueba5a.txt" << endl;
	prueba_multiple(prueba5a, salida);
	salida << endl << "prueba5b.txt" << endl;
	prueba_multiple(prueba5b, salida);
	salida << endl << "prueba5c.txt" << endl;
	prueba_multiple(prueba5c, salida);
	salida << endl << "prueba10.txt" << endl;
	prueba_multiple(prueba10, salida);
	salida << endl << "prueba10a.txt" << endl;
	prueba_multiple(prueba10a, salida);
	salida << endl << "prueba20.txt" << endl;
	prueba_multiple(prueba20, salida);
*/
	salida.close();
}
void prueba_multiple(string &filename, ofstream &salida)
{
	ifstream entrada(filename.c_str());
	Resolver res(entrada);
//	res.imprimirEntrada(salida);
	stringstream devol;
	for(int i = 0; i < 50; i++)
	{
		res.evitar_catastrofe();
		devol << res;
		entrada.close();
		entrada.open(filename.c_str());
		res.setDatos(entrada);
	}
	salida << devol.str();
}

